/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ufes.pss.exercicioSwingBanco.presenter;

import edu.ufes.pss.exercicioSwingBanco.factory.DaoAgenciaFactory;
import edu.ufes.pss.exercicioSwingBanco.factory.DaoGerenteFactory;
import edu.ufes.pss.exercicioSwingBanco.interfaces.DaoInterface;
import edu.ufes.pss.exercicioSwingBanco.model.Agencia;
import edu.ufes.pss.exercicioSwingBanco.model.Gerente;
import edu.ufes.pss.exercicioSwingBanco.view.DefinirAgenciasGerenteView;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.TreeSet;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author OdairJT
 */
public class DefinirAgenciasGerentePresenter {

    private DefinirAgenciasGerenteView view;
    private DefaultTableModel modelo;
    private Gerente gerente;

    public DefinirAgenciasGerentePresenter(Gerente pGerente) {

        this.view = new DefinirAgenciasGerenteView();
        this.gerente = pGerente;

        loadTblAgencias();
        addListenerCmbEstados();
        addListenerBtnAdicionar();
        addListenerBtnExcluir();
        addListenerBtnFechar();

        this.view.setLocationRelativeTo(null);
        this.view.setVisible(true);

    }

    public final void loadTblAgencias() {
        this.modelo = new DefaultTableModel(new Object[]{"CÓDIGO", "CIDADE", "ESTADO"}, 0) {
            @Override
            public boolean isCellEditable(int rowIndex, int mColIndex) {
                return false;
            }
        };

        this.view.getTblAgencias().setModel(modelo);
        this.view.getTblAgencias().setSelectionMode(0);
        this.view.getTblAgencias().setShowGrid(true);
        this.view.getTblAgencias().setBackground(Color.LIGHT_GRAY);
        this.view.getTblAgencias().setForeground(Color.BLUE);

        /* O padrão factory retorna a instância de acordo com a forma 
         * de persistencia selecionada
         */

        this.modelo.setNumRows(0);

        if (this.gerente.getAgencias() == null) {
            this.gerente.setAgencias(new ArrayList<Agencia>());
        }

        Iterator<Agencia> itAgencias = this.gerente.getAgencias().iterator();
        Agencia a;

        while (itAgencias.hasNext()) {
            a = itAgencias.next();
            this.modelo.addRow(new Object[]{a.getCodigo(), a.getCidade(), a.getUf()});
        }

    }

    private void addListenerCmbEstados() {
        this.view.getCmbEstados().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedCmbEstados();
            }
        });
    }

    private void actionPerformedCmbEstados() {

        if (this.view.getCmbEstados().getSelectedIndex() != 0) {

            DaoInterface p = DaoAgenciaFactory.CriarDaoAgencia(1);

            TreeSet<Agencia> agencias = (TreeSet) p.buscarTodos();

            Iterator<Agencia> itAgencias = agencias.iterator();
            Agencia a;
            String tempAgenciaCmb;

            this.view.getCmbAgencias().removeAllItems();

            while (itAgencias.hasNext()) {
                a = itAgencias.next();

                if (a.getUf().equals(this.view.getCmbEstados().getSelectedItem())) {
                    tempAgenciaCmb = a.getCodigo() + " - " + a.getCidade() + "";
                    this.view.getCmbAgencias().addItem(tempAgenciaCmb);
                }
            }

            this.view.getCmbAgencias().setEnabled(true);

        }

    }

    private void addListenerBtnAdicionar() {
        this.view.getBtnAdicionar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnAdicionar();
            }
        });
    }

    private void actionPerformedBtnAdicionar() {

        String[] codigo = this.view.getCmbAgencias().getSelectedItem().toString().split(" - ");

        DaoInterface a = DaoAgenciaFactory.CriarDaoAgencia(1);
        Agencia agencia = (Agencia) a.buscarObjeto(codigo[0]);

        int flag = 0;
        for (int i = 0; i < this.gerente.getAgencias().size(); i++) {
            if (this.gerente.getAgencias().get(i).getCodigo().equals(codigo[0])) {
                flag++;
            }
        }

        if (flag == 0) {
            this.gerente.getAgencias().add(agencia);

            DaoInterface g = DaoGerenteFactory.CriarDaoGerente(1);

            if (g.salvarOuAtualizar(gerente)) {
                this.modelo.addRow(new Object[]{agencia.getCodigo(), agencia.getCidade(), agencia.getUf()});
            }
        } else {
            this.view.showMessage("Esta agência já está associada a este gerente!");
        }
    }

    private void addListenerBtnExcluir() {
        this.view.getBtnExcluir().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnExcluir();
            }
        });
    }

    private void actionPerformedBtnExcluir() {

        if (this.view.getTblAgencias().getSelectedRow() != -1) {

            if (this.gerente.getAgencias() != null) {

                String codigo = (String) this.view.getTblAgencias().getValueAt(
                        this.view.getTblAgencias().getSelectedRow(), 0);

                for (int i = 0; i < this.gerente.getAgencias().size(); i++) {
                    if (this.gerente.getAgencias().get(i).getCodigo().equals(codigo)) {
                        this.gerente.getAgencias().remove(i);
                    }
                }

                DaoInterface p = DaoGerenteFactory.CriarDaoGerente(1);

                if (p.salvarOuAtualizar(gerente)) {
                    this.loadTblAgencias();
                }

            }

        } else {
            this.view.showMessage("Selecione uma linha para continuar!");
        }

    }

    private void addListenerBtnFechar() {
        this.view.getBtnFechar().addActionListener(
                new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                actionPerformedBtnFechar();
            }
        });
    }

    private void actionPerformedBtnFechar() {
        ListaGerentePresenter listaGerentePresenter = new ListaGerentePresenter();
        this.view.dispose();
    }
}
